forSomeによる存在型:Scala 3で廃止予定の機能(6)

Scala 3.3.4
最終更新:2020年9月28日

[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください

この記事では、Scala 3で廃止されるforSomeキーワードと存在型について解説します。

forSomeは廃止されました

forSomeを使用した存在型は廃止されました。廃止される理由は以下の通りです。

  • 存在型は、DOTやDottyが構築されている型の健全性の原則に違反している。
    • この原則によると、型選択p.TS#Tのすべての接頭辞(p, 特にS)は、実行時に構築された値に由来するか、良好な境界しか持たないことが知られている型を参照しなければならない。
  • 存在型は、他のScalaの構造体との相互作用が難しい。
  • 存在型は経路依存型と大部分が重複しているため、存在型をサポートするメリットが小さい。

forSomeを使用しない存在型は、制約付きながらサポートされる

ワイルドカードのみで表現できる存在型(forSomeではなく)はサポートされていますが、洗練された型として扱われます。例えば

Map[_ <: AnyRef, Int]

Map という型として扱われます。第一の型パラメータの上限境界は AnyRef で、第二の型パラメータは Int のエイリアスとなります。

Scala 3.0では完全に廃止

Scala 3.0にはforSomeは実装されませんでした。

したがって、Scala 3.0へのアップデートの前に、forSomeの使用をやめる必要があります。

また、scalacでコンパイルされたクラスファイルを読み込む際には、Dottyは存在型をそれ本来の型で近似するよう試みますが、限界はあります。

たとえばforSomeを使用しているScala 2.13のライブラリをScala 3から使用する場合、挙動を正確に再現できない可能性がありますので注意してください。

存在型の代わりに経路依存型へ移行する

存在型を経路依存型へと移行しましょう。

移行ガイドには参考となるサンプルが紹介されています。

外部リンク:Dropped: Existential Types

サイト内検索